package com.ywdnf.gomoku.util;

import com.ywdnf.gomoku.model.chess.Game;
import com.ywdnf.gomoku.model.chess.Player;
import com.ywdnf.gomoku.web.control.GomokuController;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.lang.NonNull;

/**
 * 通用工具类
 *
 * @author lss
 * @date 2019-02-01, Fri
 */
public class CommonUtil {

  private static final String CHAR_1 = "&";
  private static final String CHAR_2 = "=";

  private static final DateTimeFormatter FTF = DateTimeFormatter.ofPattern("MM-dd HH:mm");


  public static String convertTimeToString(Long time) {
    if (time == null) {
      return "未知时间";
    }
    return FTF.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()));
  }

  /**
   * 获取uri
   *
   * @param request 请求
   * @return uri
   */
  public static String getRequestUri(HttpServletRequest request) {
    return request.getRequestURI();
  }

  /**
   * 获取url中的参数键值对，多个value对应一个key只取第一个值
   *
   * @param url foo
   * @return map模型
   */
  public static Map<String, String> getQueryParams(String url) {
    Map<String, String> params = new HashMap<>(16);
    try {
      String[] urlParts = url.split("\\?");
      if (urlParts.length > 1) {
        String query = urlParts[1];
        //"?hello=1&id=2"
        for (String param : query.split(CHAR_1)) {
          String[] pair = param.split(CHAR_2);
          String key = URLDecoder.decode(pair[0], "UTF-8");
          String value = "";
          if (pair.length > 1) {
            value = URLDecoder.decode(pair[1], "UTF-8");
          }
          params.put(key, value);
        }
      }
    } catch (UnsupportedEncodingException ignored) {
    }
    return params;
  }


  /**
   * 获取url中某个value
   *
   * @param url foo
   * @param key key
   * @return value
   */
  public static String getValueByKeyInUrl(String url, String key) {
    return getQueryParams(url).get(key);
  }


  /**
   * 获取文件后缀
   *
   * @param filename 文件名
   * @return 文件后缀
   */
  public static String getFileSuffix(String filename) {
    return filename.substring(filename.lastIndexOf(".") + 1);
  }


  /**
   * 获取聊天室编号redis hashkey
   *
   * @param fooId 聊天室编号
   * @return hashkey
   */
  public static String getFooIdHashValue(String fooId) {
    return String.valueOf(fooId.hashCode());
  }


  public static String getReturnUrlToGmk(String gameId, String userId, String ckId)
      throws UnsupportedEncodingException {
    return URLDecoder
        .decode("/gomoku/" + (gameId.contains(Const.HALF_HENG) ? getBriefGameId(gameId) : gameId) + "?gameId=" + gameId
                + "&userId=" + userId + "&ckId=" + ckId,
            "UTF-8");
  }

  public static String getReturnUrlToGmk(String gameId, String userId) {
    return "/gomoku/" + (gameId.contains(Const.HALF_HENG) ? getBriefGameId(gameId) : gameId) + "?gameId=" + gameId
        + "&userId=" + userId;
  }

  public static String getReturnALinkToGmk(String gameBriefId) {
    return "/api/gomoku/join?g-id=" + gameBriefId + "&u-nick=";
  }

  public static String getBriefGameId(String gameId) {
    return gameId.substring(gameId.indexOf(Const.HALF_HENG) + 1);
  }

  public static String getFullGameId(String gameBriefId) {
    if (gameBriefId.contains(Const.HALF_HENG)) {
      return gameBriefId;
    }
    return Const.GAME_ID_PREFIX + Const.HALF_HENG + gameBriefId;
  }


  /**
   * 已知一个玩家的编号，获取另一个玩家的id
   *
   * @param userId 已知玩家的编号
   * @param g 游戏
   * @return 另一个玩家
   */
  public static Player getOthPlayer(String userId, @NonNull Game g) {
    if (g.getPlayer1() == null) {
      if (g.getPlayer2() == null) {
        return null;
      }
      return g.getPlayer2().getUserId().equals(userId) ? null : g.getPlayer2();
    }
    return g.getPlayer1().getUserId().equals(userId) ? g.getPlayer2() : g.getPlayer1();
  }

  /**
   * 已知一个玩家的编号，获取另一个玩家的id
   *
   * @param userId 已知玩家的编号
   * @param gameId 游戏编号
   * @return 另一个玩家
   */
  public static Player getOthPlayer(String userId, String gameId) {
    return getOthPlayer(userId, GomokuController.getGame(gameId));
  }

  /**
   * 已知玩家的编号，获取此玩家
   *
   * @param userId 玩家的编号
   * @param g 游戏
   * @return 玩家
   */
  public static Player getSelfPlayer(String userId, @NonNull Game g) {
    if (g.getPlayer1() == null) {
      if (g.getPlayer2() == null) {
        return null;
      }
      return g.getPlayer2().getUserId().equals(userId) ? g.getPlayer2() : null;
    }
    return g.getPlayer1().getUserId().equals(userId) ? g.getPlayer1() : g.getPlayer2();
  }

  /**
   * 已知玩家的编号，获取此玩家
   *
   * @param userId 玩家的编号
   * @param gameId 游戏id
   * @return 玩家
   */
  public static Player getSelfPlayer(String userId, String gameId) {
    return getSelfPlayer(userId, GomokuController.getGame(gameId));
  }

}
